package persistencia.carreras.ensambladores.general;

import modelo.geometria.Circunferencia;
import modelo.seniales.carteles.CirculacionExclusiva;
import compartido.IEntidad;

import persistencia.IAlmacen;
import persistencia.IEnsamblador;
import persistencia.IIngrediente;
import persistencia.IProducto;
import persistencia.carreras.ensambladores.Campos;
import persistencia.carreras.ensambladores.Dummies;
import persistencia.carreras.ensambladores.EnsambladorComun;
import persistencia.compartido.ProductoSinValores;
import persistencia.compartido.Tipo;
import persistencia.excepciones.EscritorIncompatible;
import persistencia.excepciones.LectorIncompatible;

public class EnsambladorCirculacionExclusiva implements IEnsamblador {

	@Override
	public boolean esComptabile(IProducto p) {
		return true;
	}

	@Override
	public IEntidad leer(IProducto p, IAlmacen almacen) throws LectorIncompatible {
		long id = Long.valueOf(p.getNombre());
		Circunferencia vision = Campos.leerVision(p, "");
		CirculacionExclusiva cartel = new CirculacionExclusiva(id, vision.getCentro(), null); 
		return cartel;
	}

	@Override
	public boolean esCompatible(IEntidad e) {
		return (e instanceof CirculacionExclusiva);
	}

	@Override
	public IProducto escribir(IEntidad e, IAlmacen fabrica) throws EscritorIncompatible {
		if (!esCompatible(e))
			throw new EscritorIncompatible();
		
		CirculacionExclusiva cartel = (CirculacionExclusiva)e;

		Tipo<IEntidad> tipo = new Tipo<IEntidad>(e.getClass());
		
		EnsambladorComun comun = new EnsambladorComun(fabrica);
		
		IProducto p = fabrica.crearProducto(Campos.identificador,cartel.getIdentificador(), tipo);
		comun.armarObstaculo(p, cartel);
		IIngrediente vehiculo = fabrica.crearIngrediente(Campos.vehiculo,null);
		p.agregar(vehiculo);
		return p;
	}

	@Override
	public IProducto getDummy(Tipo<IEntidad> tipo) throws EscritorIncompatible {
		Tipo<IEntidad> acepta = new Tipo<IEntidad>(CirculacionExclusiva.class);
		acepta.esSuperTipoDe(tipo);
		
		ProductoSinValores p = new ProductoSinValores();
		p.agregarCampo(Campos.identificador);
		Dummies.esObstaculo(p, "");
		p.agregarCampo(Campos.vehiculo);
		
		return p;
	}

}
